part of '../launch.dart';

launchApp({
  /// 主页
  required Widget app,

  /// 在App实际运行之前由用户自行指定的流程
  FutureOr<void> Function()? prelaunch,
  Function(Object error, StackTrace? stack)? onError,
}) async {
  // 确保flutter绑定已经初始化
  // 如果不加，会出现无法捕获错误的情况
  WidgetsFlutterBinding.ensureInitialized();

  // 捕捉同步错误
  FlutterError.onError = (FlutterErrorDetails details) {
    onError?.call(details.exception, details.stack);
  };
  // 捕捉异步错误
  PlatformDispatcher.instance.onError = (error, stack) {
    if (onError != null) {
      onError.call(error, stack);
      return true; // 表示错误已处理
    }
    // 错误未处理
    return false;
  };

  // 在此函数中启动App（如果在这个阶段里也出现了错误，那么也用同样的错误处理逻辑）
  try {
    await prelaunch?.call();
  } catch (error, stack) {
    if (onError != null) {
      onError.call(error, stack);
    } else {
      rethrow;
    }
  }

  runApp(app);
}
